package com.cetc.common.validate;

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * Created by Administrator on 2018/9/26.
 */
public class DateTypeValidator implements ConstraintValidator<DateType, String> {

    /**
     * 日期显示类型
     * 1：yyyy-MM-dd
     * 2：yyyy-MM-dd HH:mm
     * 3：yyyy-MM-dd HH:mm:ss
     */
    int type;

    @Override
    public void initialize(DateType constraintAnnotation) {
        type = constraintAnnotation.type();
    }

    @Override
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if(null == value || value.equals("")){
            return true;
        }

        boolean convertSuccess = true;

        //指定日期格式为四位年/两位月份/两位日期，注意yyyy/MM/dd区分大小写
        String pattern = "";
        String message = "";
        if(type == 1){
            pattern = "yyyy-MM-dd";
            message = "只能为日期格式（如：2018-08-08）";
        }
        else if(type == 2){
            pattern = "yyyy-MM-dd HH:mm";
            message = "只能为日期格式（如：2018-08-08 01:01）";
        }
        else{
            pattern = "yyyy-MM-dd HH:mm:ss";
            message = "只能为日期格式（如：2018-08-08 01:01:01）";
        }

        //获取默认提示信息
        String defaultConstraintMessageTemplate = context.getDefaultConstraintMessageTemplate();
        //禁用默认提示信息
        context.disableDefaultConstraintViolation();
        //设置提示语
        context.buildConstraintViolationWithTemplate(message).addConstraintViolation();

        SimpleDateFormat format = new SimpleDateFormat(pattern);

        try {
            // 设置lenient为false. 否则SimpleDateFormat会比较宽松地验证日期，比如2007/02/29会被接受，并转换成2007/03/01
            format.setLenient(false);
            format.parse(value);
        } catch (ParseException e) {
            // 如果throw java.text.ParseException或者NullPointerException，就说明格式不对
            convertSuccess = false;
        }

        return convertSuccess;
    }

}